package pe.com.hermes.hermetic.beans;


import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;

import pe.com.hermes.hermetic.negocio.ultil.Util;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

import java.io.Serializable;

import java.net.InetAddress;

import java.net.UnknownHostException;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;

import pe.com.hermes.hermetic.modelo.dao.PedidoDAO;
import pe.com.hermes.hermetic.negocio.managerimpl.pedido.tv.PedidoTvManagerImpl;
import pe.com.hermes.pedidotxclient.modelo.bean.PedidoBean;
import pe.com.hermes.pedidotxclient.modelo.bean.PedidoDenoBean;
import pe.com.hermes.unidadesnegocio.boveda.entities.BovedaEntity;
import pe.com.hermes.unidadesnegocio.boveda.entities.CuentaEntity;
import pe.com.hermes.unidadesnegocio.comercial.entities.ClienteEntity;
import pe.com.hermes.unidadesnegocio.comercial.entities.ClienteGrupoEntity;
import pe.com.hermes.unidadesnegocio.comercial.entities.PuntoEntity;
import pe.com.hermes.unidadesnegocio.general.entities.TipoEntity;
import pe.com.hermes.unidadesnegocio.operaciones.entities.SucursalEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.DenominacionEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoDenoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoDetaEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.managerimpl.PedidoAbstract;

public class PedidoAjaxBean extends pe.com.hermes.hermetic.beans.PedidoBean implements Serializable{
    private int id;    
    private int cambioSucursal;    
    private double d1117;
    private double d1118;
    private double d1119;
    private double d1221;
    private double d1222;
    private double d1223;
    private double d1225;
    private double d1226;
    private double d1227;
    private double d2221;
    private double d2222;
    private double d2223;
    private double d2224;
    private double d2226;
    private double d2227;
    private double d2228;
    private double d2229;
    private double d11110;
    private double d11111;
    private double d11112;
    private double d11113;
    private double d11114;
    private double d21110;
    private double d21111;
    private double d21112;
    private double d21113;
    private double d21115;
    private double subTotalBilletes;
    private double subTotalMonedas;
    private double montPediTemp;
    //datos despues de grabar
    private int codClieOrig;
    
    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setCambioSucursal(int cambioSucursal) {
        this.cambioSucursal = cambioSucursal;
    }

    public int getCambioSucursal() {
        return cambioSucursal;
    }    

    public void setD1117(double d1117) {
        this.d1117 = d1117;
    }

    public double getD1117() {
        return d1117;
    }

    public void setD1118(double d1118) {
        this.d1118 = d1118;
    }

    public double getD1118() {
        return d1118;
    }

    public void setD1119(double d1119) {
        this.d1119 = d1119;
    }

    public double getD1119() {
        return d1119;
    }

    public void setD1221(double d1221) {
        this.d1221 = d1221;
    }

    public double getD1221() {
        return d1221;
    }

    public void setD1223(double d1223) {
        this.d1223 = d1223;
    }

    public double getD1223() {
        return d1223;
    }

    public void setD1225(double d1225) {
        this.d1225 = d1225;
    }

    public double getD1225() {
        return d1225;
    }

    public void setD1226(double d1226) {
        this.d1226 = d1226;
    }

    public double getD1226() {
        return d1226;
    }

    public void setD1227(double d1227) {
        this.d1227 = d1227;
    }

    public double getD1227() {
        return d1227;
    }

    public void setD2221(double d2221) {
        this.d2221 = d2221;
    }

    public double getD2221() {
        return d2221;
    }

    public void setD2222(double d2222) {
        this.d2222 = d2222;
    }

    public double getD2222() {
        return d2222;
    }

    public void setD2223(double d2223) {
        this.d2223 = d2223;
    }

    public double getD2223() {
        return d2223;
    }

    public void setD2224(double d2224) {
        this.d2224 = d2224;
    }

    public double getD2224() {
        return d2224;
    }

    public void setD2226(double d2226) {
        this.d2226 = d2226;
    }

    public double getD2226() {
        return d2226;
    }

    public void setD2227(double d2227) {
        this.d2227 = d2227;
    }

    public double getD2227() {
        return d2227;
    }

    public void setD2228(double d2228) {
        this.d2228 = d2228;
    }

    public double getD2228() {
        return d2228;
    }

    public void setD2229(double d2229) {
        this.d2229 = d2229;
    }

    public double getD2229() {
        return d2229;
    }

    public void setD11110(double d11110) {
        this.d11110 = d11110;
    }

    public double getD11110() {
        return d11110;
    }

    public void setD11111(double d11111) {
        this.d11111 = d11111;
    }

    public double getD11111() {
        return d11111;
    }

    public void setD11112(double d11112) {
        this.d11112 = d11112;
    }

    public double getD11112() {
        return d11112;
    }

    public void setD11113(double d11113) {
        this.d11113 = d11113;
    }

    public double getD11113() {
        return d11113;
    }

    public void setD11114(double d11114) {
        this.d11114 = d11114;
    }

    public double getD11114() {
        return d11114;
    }

    public void setD21110(double d21110) {
        this.d21110 = d21110;
    }

    public double getD21110() {
        return d21110;
    }

    public void setD21111(double d21111) {
        this.d21111 = d21111;
    }

    public double getD21111() {
        return d21111;
    }

    public void setD21112(double d21112) {
        this.d21112 = d21112;
    }

    public double getD21112() {
        return d21112;
    }

    public void setD21113(double d21113) {
        this.d21113 = d21113;
    }

    public double getD21113() {
        return d21113;
    }

    public void setD21115(double d21115) {
        this.d21115 = d21115;
    }

    public double getD21115() {
        return d21115;
    }

    public void setSubTotalBilletes(double subTotalBilletes) {
        this.subTotalBilletes = subTotalBilletes;
    }

    public double getSubTotalBilletes() {
        return subTotalBilletes;
    }

    public void setSubTotalMonedas(double subTotalMonedas) {
        this.subTotalMonedas = subTotalMonedas;
    }

    public double getSubTotalMonedas() {
        return subTotalMonedas;
    }

    public void setD1222(double d1222) {
        this.d1222 = d1222;
    }

    public double getD1222() {
        return d1222;
    }       

    public void setCodClieOrig(int codClieOrig) {
        this.codClieOrig = codClieOrig;
    }

    public int getCodClieOrig() {
        return codClieOrig;
    }
    public void setMontPediTemp(double montPediTemp) {
        this.montPediTemp = montPediTemp;
    }

    public double getMontPediTemp() {
        return montPediTemp;
    }
  public PedidoBean toPedidoBean(PedidoDAO pedidoDAO){
          PedidoBean pedidoBean = new PedidoBean();
          List<PedidoDenoBean> pedidosDenoBean = new ArrayList<PedidoDenoBean>();
          pedidoBean.setIdPedido(id);
          pedidoBean.setTipPedi(Integer.parseInt(ConstantesHermetic.TIPO_PEDIDO_TRASL_VAL));
          pedidoBean.setCodCntaOrig(codCntaOrig);
          pedidoBean.setCodClieOrig(codClieOrig);
          pedidoBean.setCodPunt(codPunt);
          pedidoBean.setDesDireEntg(desDireEntg);
          pedidoBean.setCodCntaDest(codCntaDest);
          pedidoBean.setCodClieDest(codClieDest);
          pedidoBean.setFecAtenPedi(fecAtenPedi);
          pedidoBean.setHorAtenInicPact(horAtenInicPact);
          pedidoBean.setFecProcAper(fecProcAper);
          pedidoBean.setIndPrio(Integer.parseInt(ConstantesHermetic.IND_PRIO));        
          pedidoBean.setTxtObsv(txtObsv);
          pedidoBean.setUsuWeb(Util.getUser().getUsuWeb());
          pedidoBean.setTipBill(tipBill);
          pedidoBean.setCodSucuHtb(codSucuHtb);
          pedidoBean.setCodClieGrup(codClieGrup);
          pedidoBean.setFecSoliPedi(fecSoliPedi);
          pedidoBean.setHorSoliPedi(horSoliPedi);
          pedidoBean.setCodDiarPedi(codDiarPedi);
          pedidoBean.setIndPediBanc(Integer.parseInt(ConstantesHermetic.TIPO_PEDI_BANC));
          pedidoBean.setCodTrnp(Integer.parseInt(ConstantesHermetic.COD_TRNP));
          pedidoBean.setCodSucuPedi(Integer.parseInt(Util.getUser().getCodSucuHtb()));
          try {
              pedidoBean.setNomComp(InetAddress.getLocalHost().getHostName());
          } catch (UnknownHostException e) {
               pedidoBean.setNomComp("PC-GENERICO");
          }
          pedidoBean.setIndCambSucu(cambioSucursal);
          pedidoBean.setTipUnidMone(tipUnidMone);
          pedidoBean.setMontTotMone(subTotalMonedas);
          pedidoBean.setMontTotBill(subTotalBilletes);
          pedidoBean.setCodSucuHtbPropuesto(codSucuHtbPropuesto);        
          pedidoBean.setDesCntaOrig(desCntaOrig);
          pedidoBean.setDesTipUnidMone(desTipUnidMone);
          pedidoBean.setDesTipBill(desTipBill);
          pedidoBean.setDesTipDest(desTipDest);
          pedidoBean.setMontPedi(montPediTemp);        
          pedidoBean.setNomClie(nomClie);
          pedidoBean.setTipDest(tipDest);
          pedidoBean.setDesPunt(desPunt);
          pedidoBean.setDesSucuHtb(desSucuHtb);        
          List<DenominacionMonedaBean> listDenoByTipUnidMone = pedidoDAO.getDenominacion(String.valueOf(tipUnidMone));
          for(DenominacionMonedaBean denoMoneBean : listDenoByTipUnidMone){
              String codDenoProperty = "d"+String.valueOf(tipUnidMone)+denoMoneBean.getTipoMoneda()+denoMoneBean.getTipoMoneda()+denoMoneBean.getCodDenominacion();
              double montDeno = 0.00;
              PedidoDenoBean pedidoDenoBean = new PedidoDenoBean();
              try {
                  BeanInfo bi= Introspector.getBeanInfo(PedidoAjaxBean.class);
                  PropertyDescriptor[] pds = bi.getPropertyDescriptors();
                  for (PropertyDescriptor pd : pds) {
                      String propertyName = pd.getName();                                
                      if(codDenoProperty.equalsIgnoreCase(propertyName)){
                          try{                            
                              pedidoDenoBean.setCanValoNomi(denoMoneBean.getTipoDenominacion());
                              pedidoDenoBean.setCodDeno(Integer.parseInt(denoMoneBean.getCodDenominacion()));
                              pedidoDenoBean.setTipMone(Integer.parseInt(denoMoneBean.getTipoMoneda()));
                              montDeno = Double.parseDouble(BeanUtils.getProperty(this, propertyName));
                              pedidoDenoBean.setMontDeno(montDeno);
                          }catch(Exception e){                            
                              montDeno = 0.00;
                              pedidoDenoBean.setMontDeno(montDeno);
                          }
                          pedidosDenoBean.add(pedidoDenoBean);
                      }
                  }                            
              } catch (IntrospectionException e) {
                  
              }                                                
          } 
          pedidoBean.setPedidosDeno(pedidosDenoBean);
          return pedidoBean;
      }
  
  public PedidoTvManagerImpl toPedidoEntity(PedidoDAO pedidoDAO){
      PedidoTvManagerImpl pedidoEntity = new PedidoTvManagerImpl();
      List<PedidoDenoEntity> pedidosDenoBean = new ArrayList<PedidoDenoEntity>();
      List<PedidoDetaEntity> pedidosDetaBean = new ArrayList<PedidoDetaEntity>();
      
      pedidoEntity.setIdPedido(id);
      pedidoEntity.setFecProcAper(fecProcAper);
      pedidoEntity.setCuentaOrig(new CuentaEntity(codCntaOrig));
      pedidoEntity.getCuentaOrig().setDesCnta(desCntaOrig);
      pedidoEntity.setUnidMone(new TipoEntity(tipUnidMone+"",desTipUnidMone));
      pedidoEntity.setFecSoliPedi(fecSoliPedi);
      pedidoEntity.setHorSoliPedi(horSoliPedi);
      pedidoEntity.setFecAtenPedi(fecAtenPedi);
      pedidoEntity.setHorAtenInicPact(horAtenInicPact);
      
      pedidoEntity.setHorFinlInicPact("");
      pedidoEntity.setTipDest(new TipoEntity(tipDest+"",desTipDest));
      pedidoEntity.setTipDestPedi(tipDest+"");
      pedidoEntity.setPunt(new PuntoEntity(codPunt));
      pedidoEntity.getPunt().setDesPunt(desPunt);
      pedidoEntity.getPunt().setDesDire(desDireEntg);
      pedidoEntity.setSucuHtb(new SucursalEntity(codSucuHtb,desSucuHtb));
      pedidoEntity.setSucuHtbPropuesto(new SucursalEntity(codSucuHtbPropuesto));
      pedidoEntity.setIndCambSucu(indCambSucu);
      pedidoEntity.setSucuHtbPedi(new SucursalEntity(codSucuPedi,desSucuPedi));
      pedidoEntity.setTxtObsv(txtObsv);
      pedidoEntity.setMontPedi(montPedi);
      pedidoEntity.setClieGrup(new ClienteGrupoEntity(codClieGrup));
      pedidoEntity.setEstado(estado);
      pedidoEntity.setNumPedi(numPedi);
      pedidoEntity.setCodDiarPedi("");
      pedidoEntity.setTipDocuPedi(tipDocuPedi);
      pedidoEntity.setClieOrig(new ClienteEntity(codClieOrig));
      pedidoEntity.setCuentaDest(new CuentaEntity(0));//solo transferencia, que vaya nulo
      pedidoEntity.setClieDest(new ClienteEntity(0));//solo transferencia, que vaya nulo
      pedidoEntity.setIndPrio(new TipoEntity(indPrio));///solo atm, nulo
      pedidoEntity.setBilletaje(new TipoEntity(tipBill+"",desTipBill));
      pedidoEntity.setIndProg(indProg);
      pedidoEntity.setUsuWeb(usuWeb);
      pedidoEntity.setClieFact(new ClienteEntity(pedidoDAO.getCodClieFact(codPunt, codClieOrig, codClieGrup, codSucuHtb, codCntaOrig)));
      pedidoEntity.setMontTotBill(subTotalBilletes);
      pedidoEntity.setMontTotMone(subTotalMonedas);
      pedidoEntity.setTipRegiPedi(Integer.parseInt(tipRegiPedi));
      pedidoEntity.setTipPrio(new TipoEntity(0));
      if (tipDest == Integer.parseInt(ConstantesHermetic.TIPO_DESTINO_AGENCIA)){
        pedidoEntity.setTipProc(new TipoEntity(ConstantesHermetic.TIP_PROC_REG_PEDI_TV));
        pedidoEntity.setTipDest(new TipoEntity(ConstantesHermetic.TIPO_DESTINO_AGENCIA,desTipDest));
        pedidoEntity.setTipDestPedi(ConstantesHermetic.TIPO_DESTINO_AGENCIA);
      }
      else {
        pedidoEntity.setTipProc(new TipoEntity(ConstantesHermetic.TIP_PROC_REG_PEDI_COMERCIAL));
        pedidoEntity.setTipDest(new TipoEntity(ConstantesHermetic.TIPO_DESTINO_CLIENTES,desTipDest));
        pedidoEntity.setTipDestPedi(ConstantesHermetic.TIPO_DESTINO_CLIENTES);
      }
      pedidoEntity.setTipOrigSist(tipOrigSist);
      pedidoEntity.setNumCateNiveAuto(numCateNiveAuto);
      try {
          pedidoEntity.setNomComp(InetAddress.getLocalHost().getHostName());
      } catch (UnknownHostException e) {
           pedidoEntity.setNomComp("PC-GENERICO");
      }

      int codBoveBill = 0;
      int codBoveMone = 0;
      int caso = 0;
      double totalBilletes = pedidoEntity.getMontTotBill();
      double totalMonedas = pedidoEntity.getMontTotMone();
      codBoveBill = pedidoDAO.getBovedaDePedido(codClieOrig,codSucuHtb,codCntaOrig,tipUnidMone,ConstantesHermetic.TIP_MON_BILLE);
      codBoveMone = pedidoDAO.getBovedaDePedido(codClieOrig,codSucuHtb,codCntaOrig,tipUnidMone,ConstantesHermetic.TIP_MON_FEBLE);
      int nseItemPedido = 1;
      int nseSecuencia = 1;
      PedidoDetaEntity pedidoDetaEntity;
      if ((totalBilletes>0&&totalMonedas>0)&&(codBoveBill==codBoveMone))
        caso = 1;
      else
        caso = 2;
      switch (caso){
        case 1:
            pedidoDetaEntity = new PedidoDetaEntity();
            pedidoDetaEntity.setBoveda(new BovedaEntity(codBoveBill));
            pedidoDetaEntity.setBilletaje(pedidoEntity.getBilletaje());
            pedidoDetaEntity.setNomComp(nomComp);
            pedidoDetaEntity.setUsuCrea(usuCrea);
            pedidoDetaEntity.setUsuWeb(usuWeb);
            pedidoDetaEntity.setMontPedi(totalBilletes+totalMonedas);
            pedidoDetaEntity.setNseItemPedi(nseItemPedido);
            pedidosDetaBean.add(pedidoDetaEntity);
            nseItemPedido++;
        break;
        case 2:
            if(totalBilletes>0){
                pedidoDetaEntity = new PedidoDetaEntity();
                pedidoDetaEntity.setBoveda(new BovedaEntity(codBoveBill));
                pedidoDetaEntity.setBilletaje(pedidoEntity.getBilletaje());
                pedidoDetaEntity.setNomComp(nomComp);
                pedidoDetaEntity.setUsuCrea(usuCrea);
                pedidoDetaEntity.setUsuWeb(usuWeb);
                pedidoDetaEntity.setMontPedi(totalBilletes);
                pedidoDetaEntity.setNseItemPedi(nseItemPedido);
                pedidosDetaBean.add(pedidoDetaEntity);
                nseItemPedido++;
            }
            if(totalMonedas>0){
                pedidoDetaEntity = new PedidoDetaEntity();
                pedidoDetaEntity.setBoveda(new BovedaEntity(codBoveMone));
                pedidoDetaEntity.setBilletaje(pedidoEntity.getBilletaje());
                pedidoDetaEntity.setNomComp(nomComp);
                pedidoDetaEntity.setUsuCrea(usuCrea);
                pedidoDetaEntity.setUsuWeb(usuWeb);
                pedidoDetaEntity.setMontPedi(totalMonedas);
                pedidoDetaEntity.setNseItemPedi(nseItemPedido);
                pedidosDetaBean.add(pedidoDetaEntity);
                nseItemPedido++;
            }
        break;
      } 

      
      List<DenominacionMonedaBean> listDenoByTipUnidMone = pedidoDAO.getDenominacion(String.valueOf(tipUnidMone));

      for(DenominacionMonedaBean denoMoneBean : listDenoByTipUnidMone){
          String codDenoProperty = "d"+String.valueOf(tipUnidMone)+denoMoneBean.getTipoMoneda()+denoMoneBean.getTipoMoneda()+denoMoneBean.getCodDenominacion();
          double montDeno = 0.00;
          PedidoDenoEntity pedidoDenoBean = new PedidoDenoEntity();
          try {
              BeanInfo bi= Introspector.getBeanInfo(PedidoAjaxBean.class);
              PropertyDescriptor[] pds = bi.getPropertyDescriptors();
              for (PropertyDescriptor pd : pds) {
                  String propertyName = pd.getName();                                
                  if(codDenoProperty.equalsIgnoreCase(propertyName)){
                      try{
                          pedidoDenoBean.setDeno(new DenominacionEntity());
                          pedidoDenoBean.getDeno().setCanValoNomi(denoMoneBean.getTipoDenominacion());
                          pedidoDenoBean.getDeno().setCodDeno(Integer.parseInt(denoMoneBean.getCodDenominacion()));
                          pedidoDenoBean.getDeno().setTipdMone(new TipoEntity(denoMoneBean.getTipoMoneda()));
                          pedidoDenoBean.setTipMone(new TipoEntity(denoMoneBean.getTipoMoneda()));
                          pedidoDenoBean.setUnidMone(pedidoEntity.getUnidMone());
                          if ((pedidoDenoBean.getTipMone().getCodTipo().equals(ConstantesHermetic.TIP_MON_FEBLE + ""))&&(nseItemPedido==3))
                            nseSecuencia = 2;
                          else
                            nseSecuencia = 1;
                          pedidoDenoBean.setNseItemPedi(nseSecuencia);
                          pedidoDenoBean.setNomComp(pedidoEntity.getNomComp());
                          pedidoDenoBean.setUsuCrea(pedidoEntity.getUsuCrea());
                          pedidoDenoBean.setUsuWeb(pedidoEntity.getUsuWeb());
                          montDeno = Double.parseDouble(BeanUtils.getProperty(this, propertyName));
                          pedidoDenoBean.setMontDeno(montDeno);
                      }catch(Exception e){                            
                          montDeno = 0.00;
                          pedidoDenoBean.setMontDeno(montDeno);
                      }
                      if (montDeno > 0)
                        pedidosDenoBean.add(pedidoDenoBean);
                  }
              }                            
          } catch (IntrospectionException e) {
              
          }                                                
      }
      pedidoEntity.setDenosPedido(pedidosDenoBean);
      pedidoEntity.setDetasPedido(pedidosDetaBean);
      pedidoEntity.setDenosDetaPedido(new ArrayList());
      //pedidoEntity.setmonttotSol
      //pedidoEntity.setmonttotDol
      //pedidoEntity.setfecprocaperprop
      //seteamos la programacion
      if (desProg == null) desProg = "";
      pedidoEntity.setDesProgPedi(desProg);
      pedidoEntity.setProgPedi(progPedi);
      return pedidoEntity;
  }

}
